/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dominio.modelo;

import java.math.BigDecimal;
import java.math.MathContext;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Component;
import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticuloSede;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioMotivo;
import pe.com.cotelasa.scp.dominio.service.IServicioParametroDetalle;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDetalleFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ArticuloSede;
import pe.com.cotelasa.scp.entidad.ArticuloSedePK;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Kardex;
import pe.com.cotelasa.scp.entidad.KardexPK;
import pe.com.cotelasa.scp.entidad.MaterialConsumido;
import pe.com.cotelasa.scp.entidad.Motivo;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacion;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;

/**
 *
 * @author WINDOWS 7
 */
@Component("kardexModel")
public class KardexModelImpl extends MBGenerico implements KardexModel {

    @Inject
    private IServicioArticuloSede servicioArticuloSede;
    @Inject
    private IServicioKardex servicioKardex;
    @Inject
    private IServicioMotivo servicioMotivo;
    @Inject
    private IServicioGuiaRemision servicioGuia;
    @Inject
    private IServicioParametroDetalle servicioParametroDetalle;
    @Inject
    private IServicioVentaDetalleFacturacion servicioVentaDetalleFacturacion;
    @Inject
    private IServicioVentaFacturacion servicioVentaFacturacion;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioSede servicioSede;
    /*@Autowired
     BKSession session;*/

    @Override
    public void realizarKardex(Object object, String usuario) throws ModelExcepcion {
        try {
            List<Kardex> listaKardex = new ArrayList<Kardex>();
            Motivo motivo = null;
            Sede llegada = null;
            Sede partida = null;
            String tipoMovimiento = "";
            if (object instanceof GuiaRemision) {
                GuiaRemision guia = (GuiaRemision) object;
                /*if (guia.getIdOrdenCompraServicio().getTipo() == 'C') {
                 motivo = servicioMotivo.buscarMotivoPorDes("COMPRA");
                 } else {
                 System.out.println(">>>>>>>>>>>>>>>>>> SERVICIO");
                 motivo = servicioMotivo.buscarMotivoPorDes("SERVICIO");
                 }*/

                motivo = servicioMotivo.buscarMotivoPorFiltro(guia.getParametroTipoGuia().getDesParametroDet(), guia.getParametroMotivoGuia().getDesParametroDet());
                System.out.println("motivo 1" + motivo.getDeMotivo());
                if (guia.getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.SALIDA)) {
                    tipoMovimiento = Constantes.TipoMovimiento.SALIDA;
                    System.out.println(">>>>>>>>>>>>>>>>>> SALIDA");
                } else {
                    tipoMovimiento = Constantes.TipoMovimiento.ENTRADA;
                }
                System.out.println("tipo de movimiento1: " + guia.getParametroTipoGuia().getValCadena());
                System.out.println("tipo de movimiento2: " + tipoMovimiento);
                guia = servicioGuia.conseguirGuiaDeRemisionPorId(guia.getId());
                /*if (!guia.getParametroTipoGuia().getValCadena().equalsIgnoreCase(tipoMovimiento)) {
                 int idParametro = guia.getParametroTipoGuia().getId() == Constantes.TipoGuiaRemision.GUIA_ENTRADA?
                 Constantes.TipoGuiaRemision.GUIA_SALIDA:Constantes.TipoGuiaRemision.GUIA_ENTRADA;
                 guia.setParametroTipoGuia(servicioParametroDetalle.conseguirParametroDetallePorId(idParametro));
                 }*/
                listaKardex = listaKardexPorGuia(guia, motivo, usuario, tipoMovimiento);
                llegada = guia.getSedeLlegada();
                partida = guia.getSedePartida();
            } else if (object instanceof VentaFacturacion) {
                VentaFacturacion venta = servicioVentaFacturacion.obtenerFacturacion(((VentaFacturacion) object).getCoddocventa());
                System.out.println("id sede: " + venta.getSede().getIdEmpresa().getId());

                ParametroDetalle param = servicioParametroDetalle.conseguirParametroDetallePorId(venta.getMotTraslado());
                motivo = servicioMotivo.buscarMotivoPorFiltro(Constantes.TipoMovimiento.SALIDA, param.getValCadena());
                tipoMovimiento = Constantes.TipoMovimiento.SALIDA;

                listaKardex = listaKardexPorVentaFacturacion(venta, motivo, usuario, tipoMovimiento);

            }
            
            //if (listaKardex.get(0).getCaMovimiento().floatValue() >= 0) {
                System.out.println(">>>>>>>>>>>>>>>>> entro a verificar kardex: " + listaKardex.get(0).getCaMovimiento().floatValue());
                listaKardex = verificarExisteKardex(listaKardex);
            /*} else {
                System.out.println(">>>>>>>>>>>>>>>> entro a buscar existente: " + listaKardex.get(0).getCaMovimiento().floatValue());
                listaKardex = completarDataExistente(listaKardex);
            }*/

            guardarListaKardex(listaKardex);

            actualizarInventario(listaKardex, usuario);
            /*if (tipoMovimiento.equals(Constantes.TipoMovimiento.ENTRADA)) {
             actualizarInventario(listaKardex, usuario);
             } else {
             System.out.println(">>>>>>>>>>>>>>>>>>>>> INVENTARIO salida");
             if (!llegada.equals(partida)) {
             System.out.println(">>>>>>>>>>>>>>>>>>>>>  diferente");
             actualizarInventarioSedeServicio(listaKardex, llegada, usuario);
             }

             }*/
            if (tipoMovimiento.equals(Constantes.TipoMovimiento.SALIDA) && motivo.getDeCortaMotivo().contains("TRANSFORMA")) {
                actualizarInventarioSedeServicio(listaKardex, llegada, usuario);
            }



        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public void actualizarInventarioSedeServicio(List<Kardex> listaKardex, Sede llegada, String usuario) {
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> entro" + listaKardex);
        try {
            for (Kardex kardex : listaKardex) {
                ArticuloSede articulo = new ArticuloSede();
                articulo.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(), llegada.getId(), kardex.getId().getIdArticulo(), kardex.getId().getPartidaLote()));
                articulo.setUnidadMedida(kardex.getUnidadMedida());
                ArticuloSede articuloEncontrado = servicioArticuloSede.buscarArticuloSede(articulo);
                BigDecimal cantidad = kardex.getCaMovimiento();

                System.out.println(">>>>>>>>>>>>>>>>>>> cantidad = " + cantidad);

                if (articuloEncontrado == null) {
                    BigDecimal cantidad1 = cantidad;
                    if (cantidad.floatValue() < 0) {
                        cantidad1 = cantidad1.negate();
                    }
                    System.out.println(">>>>>>>>>>>>>>>>>>> no encontro " + cantidad1);
                    articulo.setCaStockDisponible(cantidad1);
                    articulo.setVaCosto(kardex.getVaCostoArticulo());
                    articulo.setFecIngreso(new Timestamp(kardex.getFecMovimiento().getTime()));
                    articulo.setEsRegistro(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()));
                    articulo.setFecCreacion(new Timestamp(new Date().getTime()));
                    articulo.setUsrCreacion(usuario);
                    if (kardex.getIdOrdenPedido() == null) {
                        articulo.setCodigoCliente("");
                    } else {
                        articulo.setCodigoCliente(kardex.getIdOrdenPedido().getCodigoOrdenPedido().split("-")[0]);
                    }
                    servicioArticuloSede.guardarArticuloSede(articulo);
                } else {
                    System.out.println(">>>>>>>>>>>>>>>>>>> encontro");
                    System.out.println(">>>>>>>>>>>>>>>>>>> cantidad disponible = " + articuloEncontrado.getCaStockDisponible());
                    System.out.println(">>>>>>>>>>>>>>>>>>> cantidad = " + cantidad);

                    BigDecimal cantidad1 = cantidad;
                    if (cantidad.floatValue() < 0) {
                        cantidad1 = cantidad1.negate();
                    }

                    articuloEncontrado.setCaStockDisponible(articuloEncontrado.getCaStockDisponible().add(cantidad1));
                    articuloEncontrado.setVaCosto(kardex.getVaCostoArticulo());
                    articuloEncontrado.setFecModificacion(new Timestamp(new Date().getTime()));
                    articuloEncontrado.setUsrModificacion(usuario);
                    if (kardex.getIdOrdenPedido() == null) {
                        articuloEncontrado.setCodigoCliente("");
                    } else {
                        articuloEncontrado.setCodigoCliente(kardex.getIdOrdenPedido().getCodigoOrdenPedido().split("-")[0]);
                    }
                    servicioArticuloSede.actualizarArticuloSede(articuloEncontrado);
                }

                /*ArticuloSede articuloEdit = new ArticuloSede();
                 articuloEdit.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(), kardex.getId().getIdSede(), kardex.getId().getIdArticulo(), kardex.getId().getPartidaLote()));

                 articuloEdit = servicioArticuloSede.buscarArticuloSede(articuloEdit);

                 articuloEdit.setCaStockDisponible(articuloEdit.getCaStockDisponible().add(cantidad));
                 articuloEdit.setVaCosto(kardex.getVaCostoArticulo());
                 articuloEdit.setFecModificacion(new Timestamp(new Date().getTime()));
                 articuloEdit.setUsrModificacion(usuario);
                 servicioArticuloSede.actualizarArticuloSede(articuloEdit);*/
            }

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public void actualizarInventario(List<Kardex> listaKardex, String usuario) {

        try {
            System.out.println("lista de kardex: " + listaKardex);
            for (Kardex kardex : listaKardex) {
                System.out.println("kardexpk: " + kardex.getId());
                System.out.println("articulo: " + kardex.getArticulo());
                System.out.println("sede: " + kardex.getSede());
                System.out.println("articulo: " + kardex.getId().getIdArticulo());
                System.out.println("sede: " + kardex.getId().getIdSede());
                ArticuloSede articulo = new ArticuloSede();
                articulo.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(), kardex.getId().getIdSede(), kardex.getId().getIdArticulo(), kardex.getId().getPartidaLote()));
                articulo.setUnidadMedida(kardex.getUnidadMedida());
                ArticuloSede articuloEncontrado = servicioArticuloSede.buscarArticuloSede(articulo);
                if (articuloEncontrado == null) {
                    articulo.setCaStockDisponible(kardex.getCaStockFinal());
                    articulo.setVaCosto(kardex.getVaCostoArticulo());
                    articulo.setFecCreacion(new Timestamp(new Date().getTime()));
                    articulo.setUsrCreacion(usuario);
                    articulo.setFecIngreso(new Timestamp(kardex.getFecMovimiento().getTime()));
                    if (kardex.getIdOrdenPedido() == null) {
                        articulo.setCodigoCliente("");
                    } else {
                        articulo.setCodigoCliente(kardex.getIdOrdenPedido().getCodigoOrdenPedido().split("-")[0]);
                    }
                    servicioArticuloSede.guardarArticuloSede(articulo);
                } else {
                    articuloEncontrado.setCaStockDisponible(kardex.getCaStockFinal());
                    articuloEncontrado.setVaCosto(kardex.getVaCostoArticulo());
                    articulo.setFecModificacion(new Timestamp(new Date().getTime()));
                    articulo.setUsrModificacion(usuario);
                    if (kardex.getIdOrdenPedido() == null) {
                        articulo.setCodigoCliente("");
                    } else {
                        articulo.setCodigoCliente(kardex.getIdOrdenPedido().getCodigoOrdenPedido().split("-")[0]);
                    }
                    servicioArticuloSede.actualizarArticuloSede(articuloEncontrado);
                }
            }

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public BigDecimal calcularCostoServicio(Kardex kardex, Articulo articulo, Sede sede, BigDecimal costoServicio, String usuario) {
        BigDecimal costoTotal = costoServicio.multiply(kardex.getCaMovimiento());
        /*System.out.println("costo total: " + costoTotal);
         merma = merma.divide(new BigDecimal(100));*/


        try {
            kardex.setIdGuiaRemision(servicioGuia.conseguirGuiaDeRemisionPorId(kardex.getIdGuiaRemision().getId()));
            System.out.println("LISTA DE DE DETALLE DE GUIA CALC SERVICIO: " + kardex.getIdGuiaRemision().getDetalleGuiaRemisions());
            for (DetalleGuiaRemision detalle : kardex.getIdGuiaRemision().getDetalleGuiaRemisions()) {
                System.out.println("articulo 1 val costo " + detalle.getArticulo());
                System.out.println("articulo 2 val costo " + articulo);
                System.out.println("PARtiDA 1 val costo>" + detalle.getPartidaLote() + "<");
                System.out.println("PARtiDA 2 val costo>" + kardex.getId().getPartidaLote() + "<");
                System.out.println("ESTADO DE REGISTRO val costo " + detalle.getEstadoRegistro());
                if (detalle.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                        && articulo.getId().equals(detalle.getArticulo().getId())
                        && detalle.getPartidaLote().equals(kardex.getId().getPartidaLote())) {
                    System.out.println("entroooooooooooooooooooooooooooo a valor de servicio");
                    System.out.println("LISTA DE MATERIALES CONSUMIDOS CALC SERVICIO: " + detalle.getMaterialCunsumidoCollection());
                    for (MaterialConsumido material : detalle.getMaterialCunsumidoCollection()) {
                        ArticuloSede articuloS = new ArticuloSede();
                        articuloS.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(),
                                sede.getId(), material.getIdArticulo().getId(), material.getPartidaLote()));
                        articuloS = servicioArticuloSede.buscarArticuloSede(articuloS);

                        articuloS.setCaStockDisponible(articuloS.getCaStockDisponible().subtract(material.getCantidadConsumida()));
                        articuloS.setUsrModificacion(usuario);

                        costoTotal = costoTotal.add(material.getValorTotal());

                        articuloS.setFecModificacion(new Timestamp(new Date().getTime()));
                        servicioArticuloSede.actualizarArticuloSede(articuloS);

                    }
                    break;
                }


            }

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
        return costoTotal.divide(kardex.getCaMovimiento(), MathContext.DECIMAL32);
    }

    public List<Kardex> listaKardexPorGuia(GuiaRemision guia, Motivo motivo, String usuario, String tipMov) {
        System.out.println("motivo 1" + motivo.getDeMotivo());
        List<Kardex> lista = new ArrayList<Kardex>();
        for (DetalleGuiaRemision detalle : guia.getDetalleGuiaRemisions()) {
            Kardex kardex = new Kardex();
            kardex.setIdOrdenPedido(guia.getOrdenPedido());
            kardex.setId(new KardexPK());
            kardex.getId().setIdArticulo(detalle.getArticulo().getId());
            kardex.getId().setPartidaLote(detalle.getPartidaLote());
            kardex.getId().setIdEmpresa(guia.getIdEmpresa().getId());
            kardex.setIdGuiaRemision(guia);
            if (tipMov.equals(Constantes.TipoMovimiento.SALIDA)) {
                kardex.setCaMovimiento(detalle.getCantidad().negate());
                kardex.setVaCostoArticulo(BigDecimal.ZERO);
                kardex.getId().setIdSede(guia.getSedePartida().getId());
                System.out.println(">>>>>>>>>>>>>>>>>> ENTRO A INICIALIZAR SALIDA");

            } else {
                System.out.println(">>>>>>>>>>>>>>>>>> ENTRO A INICIALIZAR ENTRADA");

                kardex.setCaMovimiento(detalle.getCantidad());
                kardex.getId().setIdSede(guia.getSedeLlegada().getId());


                if (guia.getIdOrdenCompraServicio() != null && guia.getIdOrdenCompraServicio().getTipo() == 'S' && !guia.getParametroMotivoGuia().getValCadena().equalsIgnoreCase("DEVOLUCION")) {
                    System.out.println(">>>>>>>>>>>>>>>>>> CALCULAR COSTO DE SERVICIO");
                    kardex.setVaCostoArticulo(
                            calcularCostoServicio(kardex, detalle.getArticulo(), guia.getSedePartida(),
                            detalle.getDetalleOrdenCompraServicio().getPrecio(), usuario));
                } else {
                    if (guia.getIdOrdenCompraServicio() != null && guia.getIdOrdenCompraServicio().getTipo() == 'S' && guia.getParametroMotivoGuia().getValCadena().equalsIgnoreCase("DEVOLUCION")) {
                        kardex.setVaCostoArticulo(descontarMaterialDevolucion(guia.getSedePartida(), detalle, usuario));
                    } else if (guia.getParametroMotivoGuia().getValCadena().endsWith("EMPRESA")) {
                        try {
                            ArticuloSede artS = new ArticuloSede();
                            artS.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(), guia.getSedePartida().getId(), kardex.getId().getIdArticulo(), kardex.getId().getPartidaLote()));
                            artS = servicioArticuloSede.buscarArticuloSede(artS);
                            System.out.println("valor de traslado = " + artS.getVaCosto());
                            kardex.setVaCostoArticulo(artS.getVaCosto());
                        } catch (ServiceException e) {
                            e.printStackTrace();
                        }

                    } else {
                        kardex.setVaCostoArticulo(detalle.getDetalleOrdenCompraServicio().getPrecio());
                    }
                }



            }

            kardex.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()));
            kardex.setFecCreacion(new Timestamp(new Date().getTime()));
            kardex.setMotivo1(motivo);
            kardex.setNuDocumento(guia.getSerie() + "-" + guia.getNumeroGuia());
            kardex.setTiMovimiento(tipMov);
            kardex.setTiDocumento("G");
            kardex.setUnidadMedida(detalle.getTipoUnidadMinima());
            kardex.setUsrCreacion(usuario);
            kardex.setFecMovimiento(guia.getFechaInicioTraslado());



            lista.add(kardex);

        }
        return lista;
    }

    public List<Kardex> listaKardexPorVentaFacturacion(VentaFacturacion venta, Motivo motivo, String usuario, String tipMov) {
        System.out.println("motivo 1" + motivo.getDeMotivo());
        List<Kardex> lista = new ArrayList<Kardex>();
        try {
            for (VentaDetalleFacturacion detalle : servicioVentaDetalleFacturacion.obtenerVentaDetalleFacturacion(venta.getCoddocventa())) {
                Kardex kardex = new Kardex();
                kardex.setId(new KardexPK());
                kardex.getId().setIdArticulo(detalle.getCodarticulo().getId());
                kardex.getId().setPartidaLote(detalle.getPartida());
                kardex.getId().setIdEmpresa(venta.getSede().getIdEmpresa().getId());
                kardex.setIdVentaFacturacion(venta);
                if (tipMov.equals(Constantes.TipoMovimiento.SALIDA)) {
                    kardex.setCaMovimiento(new BigDecimal(detalle.getCantidad()).negate());
                    kardex.setVaCostoArticulo(BigDecimal.ZERO);
                    kardex.getId().setIdSede(venta.getSede().getId());
                    System.out.println(">>>>>>>>>>>>>>>>>> ENTRO A INICIALIZAR SALIDA");
                    if (venta.getMoneda().getId() == Constantes.TipoMoneda.SOLES) {
                        kardex.setVaPrecioArticulo(new BigDecimal(detalle.getPrecUnitario() / venta.getTipoCambio()));
                    } else {
                        kardex.setVaPrecioArticulo(new BigDecimal(detalle.getPrecUnitario()));
                    }

                }

                kardex.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()));
                kardex.setFecCreacion(new Timestamp(new Date().getTime()));
                kardex.setMotivo1(motivo);
                kardex.setNuDocumento(venta.getSerieFactura() + "-" + venta.getNumFactura());
                kardex.setTiMovimiento(tipMov);
                kardex.setTiDocumento("" + servicioTipoDocumento.obtenerTipoDocumentoPorId(venta.getTipoCompago()).getNombre().charAt(0));
                kardex.setUnidadMedida(detalle.getUnidad());
                kardex.setUsrCreacion(usuario);
                kardex.setFecMovimiento(venta.getFechDocventa());



                lista.add(kardex);

            }
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        return lista;
    }

    public BigDecimal descontarMaterialDevolucion(Sede sede, DetalleGuiaRemision detalle, String usuario) {

        try {

            ArticuloSede articulo = new ArticuloSede();
            articulo.setId(new ArticuloSedePK(detalle.getGuiaRemision().getOrdenPedido().getIdEmpresa().getId(), sede.getId(), detalle.getArticulo().getId(), detalle.getPartidaLote()));
            articulo.setUnidadMedida(detalle.getTipoUnidadMinima());
            ArticuloSede articuloEncontrado = servicioArticuloSede.buscarArticuloSede(articulo);
            if (articuloEncontrado == null) {
                System.out.println("no lo encontro");
                /*articulo.setCaStockDisponible(kardex.getCaStockFinal());
                 articulo.setVaCosto(kardex.getVaCostoArticulo());
                 articulo.setFecCreacion(new Timestamp(new Date().getTime()));
                 articulo.setUsrCreacion(usuario);
                 servicioArticuloSede.guardarArticuloSede(articulo);*/
            } else {
                articuloEncontrado.setCaStockDisponible(articuloEncontrado.getCaStockDisponible().subtract(detalle.getCantidad()));
                //articuloEncontrado.setVaCosto(kardex.getVaCostoArticulo());
                articulo.setFecModificacion(new Timestamp(new Date().getTime()));
                articulo.setUsrModificacion(usuario);
                servicioArticuloSede.actualizarArticuloSede(articuloEncontrado);
            }

            return articuloEncontrado.getVaCosto();
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
        return null;
    }

    public List<Kardex> verificarExisteKardex(List<Kardex> listaKardex) {

        List<Kardex> listaTotal = new ArrayList<Kardex>();
        List<Kardex> listaNuevos = new ArrayList<Kardex>();
        List<Kardex> listaAntiguos = new ArrayList<Kardex>();

        try {
            for (Kardex kardex : listaKardex) {
                int cantidadActivos = servicioKardex.buscarCantidadKardexActivos(kardex);
                int cantidad = servicioKardex.buscarCantidadKardex(kardex);
                kardex.getId().setNuSecKardex(cantidad + 1);
                if (cantidadActivos == 0) {
                    listaNuevos.add(kardex);
                } else {
                    listaAntiguos.add(kardex);
                }
            }
            listaNuevos = completarDataNueva(listaNuevos);
            listaAntiguos = completarDataExistente(listaAntiguos);

            listaTotal.addAll(listaNuevos);
            listaTotal.addAll(listaAntiguos);


        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
        return listaTotal;
    }

    public List<Kardex> completarDataExistente(List<Kardex> lista) {

        try {
            for (Kardex kardex : lista) {
                Kardex ultimo = servicioKardex.buscarUltimoKardex(kardex);
                System.out.println(">>>>>>>>>>>>>>>>>>> ultimo kardex: " + ultimo);
                if (kardex.getId().getNuSecKardex() == null) {
                    kardex.getId().setNuSecKardex(ultimo.getId().getNuSecKardex() + 1);
                }

                kardex.setCaStockIncial(ultimo.getCaStockFinal());
                kardex.setCaStockFinal(kardex.getCaStockIncial().add(kardex.getCaMovimiento()));

                if (kardex.getVaCostoArticulo().floatValue() != 0) {
                    BigDecimal costoArticulo = kardex.getVaCostoArticulo().multiply(kardex.getCaMovimiento());
                    costoArticulo = costoArticulo.add(ultimo.getCaStockFinal().multiply(ultimo.getVaCostoArticulo()));
                    costoArticulo = costoArticulo.divide(kardex.getCaStockFinal(), MathContext.DECIMAL32);
                    kardex.setVaCostoArticulo(costoArticulo);
                } else {
                    kardex.setVaCostoArticulo(ultimo.getVaCostoArticulo());
                }
                if (kardex.getCaMovimiento().floatValue() > 0) {
                    kardex.setVaCostoPromedio(kardex.getVaCostoArticulo().multiply(kardex.getCaMovimiento()));
                } else {
                    kardex.setVaCostoPromedio(kardex.getVaCostoArticulo().multiply(kardex.getCaMovimiento()).negate());
                }

                kardex.setVaTotalInventario(kardex.getVaCostoArticulo().multiply(kardex.getCaStockFinal()));

            }
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
        return lista;
    }

    public List<Kardex> completarDataNueva(List<Kardex> lista) {

        for (Kardex kardex : lista) {
            kardex.setCaStockIncial(BigDecimal.ZERO);
            kardex.setCaStockFinal(kardex.getCaStockIncial().add(kardex.getCaMovimiento()));
            kardex.setVaCostoPromedio(kardex.getVaCostoArticulo().multiply(kardex.getCaMovimiento()));
            kardex.setVaTotalInventario(kardex.getVaCostoArticulo().multiply(kardex.getCaStockFinal()));
        }

        return lista;
    }

    @Override
    public void guardarListaKardex(List<Kardex> lista) {
        try {
            servicioKardex.guardarListaKardex(lista);
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    @Override
    public void guardarKardex(Kardex kardex) {
        try {
            servicioKardex.guardarKardex(kardex);
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    @Override
    public Kardex inicializarKardexConArticuloSede(ArticuloSede articulo) {
        Kardex kardex = new Kardex();
        try {

            KardexPK pk = new KardexPK(
                    articulo.getSede().getIdEmpresa().getId(),
                    articulo.getId().getIdSede(),
                    articulo.getId().getIdArticulo(),
                    1,
                    articulo.getId().getPartidaLote());
            kardex.setId(pk);
            kardex.setCaMovimiento(articulo.getCaStockDisponible());
            kardex.setVaCostoArticulo(articulo.getVaCosto());
            kardex.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()));
            kardex.setFecCreacion(new Timestamp(new Date().getTime()));

            kardex.setMotivo1(servicioMotivo.buscarMotivoPorDes("INICIALIZACION STOCK"));
            kardex.setNuDocumento("");
            kardex.setTiMovimiento(Constantes.TipoMovimiento.ENTRADA);
            kardex.setTiDocumento("");
            kardex.setUnidadMedida(articulo.getUnidadMedida());
            //kardex.setUsrCreacion("admin");
            kardex.setPartidaLote(articulo.getPartidaLote());
            kardex.setFecMovimiento(articulo.getFecIngreso());
            kardex.setCaStockIncial(BigDecimal.ZERO);
            kardex.setCaStockFinal(kardex.getCaStockIncial().add(kardex.getCaMovimiento()));
            kardex.setVaCostoPromedio(kardex.getVaCostoArticulo().multiply(kardex.getCaMovimiento()));
            kardex.setVaTotalInventario(kardex.getVaCostoArticulo().multiply(kardex.getCaStockFinal()));

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
        return kardex;

    }

    @Override
    public Collection<ArticuloSede> buscarMaterialesPorOrdenServicio(OrdenCompraServicio ordenCS) throws ModelExcepcion {
        Collection<ArticuloSede> listaMateriales = new ArrayList<ArticuloSede>();

        try {


            for (GuiaRemision guia : ordenCS.getGuiaRemisionCollection()) {

                if (guia.getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.SALIDA)
                        && guia.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                        && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())) {
                    for (DetalleGuiaRemision detalleGuia : guia.getDetalleGuiaRemisions()) {
                        ArticuloSede material = new ArticuloSede();
                        material.setId(new ArticuloSedePK(ordenCS.getIdEmpresa().getId(),
                                guia.getSedeLlegada().getId(),
                                detalleGuia.getArticulo().getId(),
                                detalleGuia.getPartidaLote()));
                        material = servicioArticuloSede.buscarArticuloSede(material);
                        if (material != null && material.getCaStockDisponible().floatValue() > 0 && !listaMateriales.contains(material)) {
                            listaMateriales.add(material);
                        }
                    }

                }

            }

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }

        return listaMateriales;
    }

    @Override
    public void anularKardex(Collection<Kardex> lista, String usuario) throws ModelExcepcion {
        try {
            for (Kardex kardex : lista) {

                ArticuloSede articuloSede = new ArticuloSede();
                articuloSede.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(), kardex.getId().getIdSede(), kardex.getId().getIdArticulo(), kardex.getId().getPartidaLote()));
                articuloSede = servicioArticuloSede.buscarArticuloSede(articuloSede);
                articuloSede.setCaStockDisponible(articuloSede.getCaStockDisponible().subtract(kardex.getCaMovimiento()));

                articuloSede.setUsrModificacion(usuario);
                articuloSede.setFecModificacion(new Timestamp(new Date().getTime()));
                servicioArticuloSede.actualizarArticuloSede(articuloSede);

                if (kardex.getMotivo1().getDeMotivo().contains("TRANSFORMACION") && kardex.getTiMovimiento().equalsIgnoreCase(Constantes.TipoMovimiento.SALIDA)) {
                    ArticuloSede articuloSede1 = new ArticuloSede();
                    articuloSede1.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(), kardex.getIdGuiaRemision().getSedeLlegada().getId(), kardex.getId().getIdArticulo(), kardex.getId().getPartidaLote()));
                    articuloSede1 = servicioArticuloSede.buscarArticuloSede(articuloSede1);
                    if (articuloSede1 != null) {
                        articuloSede1.setCaStockDisponible(articuloSede1.getCaStockDisponible().add(kardex.getCaMovimiento()));

                        articuloSede1.setUsrModificacion(usuario);
                        articuloSede1.setFecModificacion(new Timestamp(new Date().getTime()));

                        servicioArticuloSede.actualizarArticuloSede(articuloSede1);
                    }
                } else if (kardex.getTiMovimiento().equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA) && kardex.getMotivo1().getDeMotivo().contains("RECOJO")) {

                    anularRecojoServicio(kardex, usuario);
                } else if (kardex.getTiMovimiento().equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA) && !kardex.getMotivo1().getDeMotivo().contains("RECOJO")
                        && !kardex.getMotivo1().getDeMotivo().contains("COMPRA")) {
                    ArticuloSede articuloSede1 = new ArticuloSede();
                    articuloSede1.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(), kardex.getIdGuiaRemision().getSedePartida().getId(), kardex.getId().getIdArticulo(), kardex.getId().getPartidaLote()));
                    articuloSede1 = servicioArticuloSede.buscarArticuloSede(articuloSede1);

                    if (articuloSede1 != null) {
                        articuloSede1.setCaStockDisponible(articuloSede1.getCaStockDisponible().add(kardex.getCaMovimiento()));

                        articuloSede1.setUsrModificacion(usuario);
                        articuloSede1.setFecModificacion(new Timestamp(new Date().getTime()));

                        servicioArticuloSede.actualizarArticuloSede(articuloSede1);
                    }

                }



                kardex.setUsrModificacion(usuario);
                kardex.setFecModificacion(new Timestamp(new Date().getTime()));
                kardex.setEstadoRegistro("" + ESTADO_REGISTRO.INACTIVO.getValor());
                servicioKardex.actualizarKardex(kardex);
            }
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public void anularRecojoServicio(Kardex kardex, String usuario) {
        try {
            kardex.setIdGuiaRemision(servicioGuia.conseguirGuiaDeRemisionPorId(kardex.getIdGuiaRemision().getId()));

            Sede sede = kardex.getIdGuiaRemision().getSedePartida();
            Articulo articulo = kardex.getArticulo();

            for (DetalleGuiaRemision detalle : kardex.getIdGuiaRemision().getDetalleGuiaRemisions()) {
                if (detalle.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                        && articulo.getId().equals(detalle.getArticulo().getId())
                        && detalle.getPartidaLote().equals(kardex.getId().getPartidaLote())) {
                    for (MaterialConsumido material : detalle.getMaterialCunsumidoCollection()) {
                        ArticuloSede articuloS = new ArticuloSede();
                        articuloS.setId(new ArticuloSedePK(kardex.getId().getIdEmpresa(),
                                sede.getId(), material.getIdArticulo().getId(), material.getPartidaLote()));
                        articuloS = servicioArticuloSede.buscarArticuloSede(articuloS);
                        if (articuloS != null) {
                            articuloS.setCaStockDisponible(articuloS.getCaStockDisponible().add(material.getCantidadConsumida()));
                            articuloS.setUsrModificacion(usuario);
                            articuloS.setFecModificacion(new Timestamp(new Date().getTime()));
                            servicioArticuloSede.actualizarArticuloSede(articuloS);
                        }

                    }
                    break;
                }


            }

        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }

    }
}
